import { describe, expect, it } from "vitest";

import { findMenuByPath, findRootMenuByPath } from "../find-menu-by-path";

// 示例菜单数据
const menus: any[] = [
  { path: "/", children: [] },
  { path: "/about", children: [] },
  {
    path: "/contact",
    children: [
      { path: "/contact/email", children: [] },
      { path: "/contact/phone", children: [] },
    ],
  },
  {
    path: "/services",
    children: [
      { path: "/services/design", children: [] },
      {
        path: "/services/development",
        children: [{ path: "/services/development/web", children: [] }],
      },
    ],
  },
];

describe("menu Finder Tests", () => {
  it("finds a top-level menu", () => {
    const menu = findMenuByPath(menus, "/about");
    expect(menu).toBeDefined();
    expect(menu?.path).toBe("/about");
  });

  it("finds a nested menu", () => {
    const menu = findMenuByPath(menus, "/services/development/web");
    expect(menu).toBeDefined();
    expect(menu?.path).toBe("/services/development/web");
  });

  it("returns null for a non-existent path", () => {
    const menu = findMenuByPath(menus, "/non-existent");
    expect(menu).toBeNull();
  });

  it("handles empty menus list", () => {
    const menu = findMenuByPath([], "/about");
    expect(menu).toBeNull();
  });

  it("handles menu items without children", () => {
    const menu = findMenuByPath(
      [{ path: "/only", children: undefined }] as any[],
      "/only",
    );
    expect(menu).toBeDefined();
    expect(menu?.path).toBe("/only");
  });

  it("finds root menu by path", () => {
    const { findMenu, rootMenu, rootMenuPath } = findRootMenuByPath(
      menus,
      "/services/development/web",
    );

    expect(findMenu).toBeDefined();
    expect(rootMenu).toBeUndefined();
    expect(rootMenuPath).toBeUndefined();
    expect(findMenu?.path).toBe("/services/development/web");
  });

  it("returns null for undefined or empty path", () => {
    const menuUndefinedPath = findMenuByPath(menus);
    const menuEmptyPath = findMenuByPath(menus, "");
    expect(menuUndefinedPath).toBeNull();
    expect(menuEmptyPath).toBeNull();
  });

  it("checks for root menu when path does not exist", () => {
    const { findMenu, rootMenu, rootMenuPath } = findRootMenuByPath(
      menus,
      "/non-existent",
    );
    expect(findMenu).toBeNull();
    expect(rootMenu).toBeUndefined();
    expect(rootMenuPath).toBeUndefined();
  });
});
